LernaãšNxã䜿çšããããã³ããšã³ãã¢ãã¬ãã®ãã¯ãŒãæ¢ããŸããå€§èŠæš¡ãããžã§ã¯ãåãã®ã¯ãŒã¯ã¹ããŒã¹ç®¡çãã³ãŒãå ±æãå¹ççãªãã«ãã«ã€ããŠåŠã³ãŸãããã
ããã³ããšã³ãã¢ãã¬ãïŒLernaãšNxã«ããã¯ãŒã¯ã¹ããŒã¹ç®¡ç
çµ¶ããé²åããããã³ããšã³ãéçºã®ç¶æ³ã«ãããŠãå€§èŠæš¡ã§è€éãªãããžã§ã¯ãã®ç®¡çã¯å€§ããªèª²é¡ãšãªãåŸãŸããåŸæ¥ã®ãã«ããªããžããªèšå®ã¯ãå颿§ãæäŸããäžæ¹ã§ãã³ãŒãã®éè€ãäŸåé¢ä¿ç®¡çã®é çã®çš®ãããŒã«ã®äžè²«æ§ã®æ¬ åŠã«ã€ãªããå¯èœæ§ããããŸããããã§ã¢ãã¬ãã¢ãŒããã¯ãã£ãèŒããŸããã¢ãã¬ããšã¯ãè€æ°ã®ãããžã§ã¯ãïŒå€ãã¯é¢é£æ§ãããïŒãå«ãåäžã®ãªããžããªã§ãããå ±ã«ãã«ããããããŒãžã§ã³ç®¡çãããŸãããã®ã¢ãããŒãã¯å€ãã®å©ç¹ãæäŸããŸãããã¢ãã¬ãã广çã«ç®¡çããã«ã¯å°éçãªããŒã«ãå¿ èŠã§ãããã®èšäºã§ã¯ã2ã€ã®äººæ°ã®ãããœãªã¥ãŒã·ã§ã³ãLernaãšNxãæ¢ããŸãã
ã¢ãã¬ããšã¯ïŒ
ã¢ãã¬ããšã¯ãå€ãã®ãããžã§ã¯ãã®ã³ãŒããä¿æããããŒãžã§ã³ç®¡çã·ã¹ãã ã®ãªããžããªã§ãããããã®ãããžã§ã¯ãã¯é¢é£ããŠããå Žåãããã°ãå®å šã«ç¬ç«ããŠããå ŽåããããŸããéèŠãªã®ã¯ãããããåããªããžããªãå ±æããŠããããšã§ããGoogleãFacebookãMicrosoftãUberãªã©ã®äŒæ¥ã¯ã巚倧ãªã³ãŒãããŒã¹ã管çããããã«ã¢ãã¬ããæåè£ã«æ¡çšããŠããŸããGoogleãAndroidãChromeãGmailãå«ãã»ãŒãã¹ãŠã®ã³ãŒããåäžã®ãªããžããªã«ä¿åããŠãããšèããŠã¿ãŠãã ããã
ã¢ãã¬ãã®å©ç¹
- ã³ãŒãã®å ±æãšåå©çšïŒè€éãªããã±ãŒãžã³ã°ãå ¬éã¯ãŒã¯ãããŒãªãã«ããããžã§ã¯ãéã§ç°¡åã«ã³ãŒããå ±æã§ããŸããåããªããžããªå ã®è€æ°ã®ã¢ããªã±ãŒã·ã§ã³ã«ã·ãŒã ã¬ã¹ã«çµ±åã§ãããã¶ã€ã³ã·ã¹ãã ã©ã€ãã©ãªãæ³åããŠã¿ãŠãã ããã
- äŸåé¢ä¿ç®¡çã®ç°¡çŽ åïŒäŸåé¢ä¿ã1ãæã§ç®¡çãããã¹ãŠã®ãããžã§ã¯ãã§äžè²«æ§ã確ä¿ããŸããå ±æã©ã€ãã©ãªã®äŸåé¢ä¿ãæŽæ°ãããšãããã«äŸåãããã¹ãŠã®ãããžã§ã¯ããèªåçã«æŽæ°ãããŸãã
- ã¢ãããã¯ãªå€æŽïŒè€æ°ã®ãããžã§ã¯ãã«ãŸããã倿Žãåäžã®ã³ãããã§è¡ãããšãã§ããäžè²«æ§ã確ä¿ãããã¹ããç°¡çŽ åããŸããäŸãã°ãããã³ããšã³ããšããã¯ãšã³ãã®äž¡æ¹ã«åœ±é¿ãäžãããªãã¡ã¯ã¿ãªã³ã°ãã¢ãããã¯ã«è¡ãããšãã§ããŸãã
- ã³ã©ãã¬ãŒã·ã§ã³ã®åäžïŒããŒã ã¯åããªããžããªå ã®ç°ãªããããžã§ã¯ãã§ç°¡åã«å ±åäœæ¥ã§ããç¥èå ±æãšéšé暪æçãªéçºãä¿é²ããŸããéçºè ã¯ç°ãªãããŒã ã®ã³ãŒããç°¡åã«é²èЧããçè§£ããããšãã§ããŸãã
- äžè²«ããããŒã«ãšå®è·µïŒãã¹ãŠã®ãããžã§ã¯ãã§äžè²«ããã³ãŒãã£ã³ã°æšæºããªã³ãã£ã³ã°ã«ãŒã«ããã«ãããã»ã¹ã匷å¶ããŸããããã«ãããã³ãŒãã®å質ãšä¿å®æ§ãåäžããŸãã
- ãªãã¡ã¯ã¿ãªã³ã°ã®ç°¡çŽ åïŒãã¹ãŠã®é¢é£ã³ãŒããåããªããžããªå ã«ãããããå€§èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ãããžã§ã¯ããç°¡çŽ åãããŸããèªåãªãã¡ã¯ã¿ãªã³ã°ããŒã«ãã³ãŒãããŒã¹å šäœã§äœ¿çšã§ããŸãã
ã¢ãã¬ãã®èª²é¡
- ãªããžããªã®ãµã€ãºïŒã¢ãã¬ãã¯éåžžã«å€§ãããªãå¯èœæ§ããããã¯ããŒã³ãã€ã³ããã¯ã¹äœæã®æäœãé ããªãããšããããŸãã`git sparse-checkout`ã`partial clone`ã®ãããªããŒã«ããã®åé¡ã®ç·©åã«åœ¹ç«ã¡ãŸãã
- ãã«ãæéïŒã¢ãã¬ãå šäœããã«ãããã®ã¯æéããããããšããããç¹ã«å€§èŠæš¡ãªãããžã§ã¯ãã§ã¯é¡èã§ããLernaãNxã®ãããªããŒã«ã¯ãããã«å¯ŸåŠããããã«æé©åããããã«ãããã»ã¹ãæäŸããŸãã
- ã¢ã¯ã»ã¹å¶åŸ¡ïŒã¢ãã¬ãã®ç¹å®ã®éšåãžã®ã¢ã¯ã»ã¹ãå¶éããããšã¯è€éã«ãªãå ŽåããããŸããã¢ã¯ã»ã¹å¶åŸ¡ã¡ã«ããºã ã®æ éãªèšç»ãšå®è£ ãå¿ èŠã§ãã
- ããŒã«ã®è€éãïŒã¢ãã¬ãã®ã»ããã¢ãããšç®¡çã«ã¯ãå°éçãªããŒã«ãšç¥èãå¿ èŠã§ããåŠç¿æ²ç·ã¯æåã¯æ¥ãããããŸããã
LernaïŒã¢ãã¬ãã§ã®JavaScriptãããžã§ã¯ã管ç
Lernaã¯ãã¢ãã¬ãã§JavaScriptãããžã§ã¯ãã管çããããã®äººæ°ã®ããŒã«ã§ããGitãšnpmã䜿çšãããã«ãããã±ãŒãžãªããžããªã®ç®¡çã«é¢ããã¯ãŒã¯ãããŒãæé©åããŸããç¹ã«ãäŸåé¢ä¿ç®¡çã«npmãYarnã䜿çšãããããžã§ã¯ãã«é©ããŠããŸãã
Lernaã®äž»ãªæ©èœ
- ããŒãžã§ã³ç®¡çïŒLernaã¯ãæåŸã®ãªãªãŒã¹ä»¥éã«è¡ããã倿Žã«åºã¥ããŠãããã±ãŒãžã®ããŒãžã§ã³ãèªåçã«èšå®ããå ¬éããããšãã§ããŸããConventional Commitsã䜿çšããŠæ¬¡ã®ããŒãžã§ã³çªå·ã決å®ããŸãã
- äŸåé¢ä¿ç®¡çïŒLernaã¯ããã±ãŒãžéã®äŸåé¢ä¿ãåŠçããã¢ãã¬ãå ã®ããã±ãŒãžãäºãã«äŸåã§ããããã«ããŸããã·ã³ããªãã¯ãªã³ã¯ã䜿çšããŠããŒã«ã«ã®äŸåé¢ä¿ãäœæããŸãã
- ã¿ã¹ã¯å®è¡ïŒLernaã¯è€æ°ã®ããã±ãŒãžã«ããã£ãŠã³ãã³ãã䞊è¡ããŠå®è¡ã§ãããã«ããšãã¹ãã®ããã»ã¹ãé«éåããŸãã`package.json`ã§å®çŸ©ãããã¹ã¯ãªããã®å®è¡ããµããŒãããŠããŸãã
- 倿޿€åºïŒLernaã¯ãæåŸã®ãªãªãŒã¹ä»¥éã«å€æŽãããããã±ãŒãžãæ€åºãã察象ãçµã£ããã«ããšãããã€ãå¯èœã«ããŸãã
Lernaã®äœ¿çšäŸ
Lernaã®äœ¿çšæ³ãç°¡åãªäŸã§ç€ºããŸãã`package-a`ãš`package-b`ãšãã2ã€ã®ããã±ãŒãžãæã€ã¢ãã¬ãããããšä»®å®ããŸãã`package-b`ã¯`package-a`ã«äŸåããŠããŸãã
monorepo/
âââ lerna.json
âââ package.json
âââ packages/
â âââ package-a/
â â âââ package.json
â â âââ index.js
â âââ package-b/
â âââ package.json
â âââ index.js
1. Lernaã®åæåïŒ
lerna init
ããã«ãã`lerna.json`ãäœæãããã«ãŒãã®`package.json`ãæŽæ°ãããŸãã`lerna.json`ãã¡ã€ã«ã¯Lernaã®åäœãèšå®ããŸãã
2. äŸåé¢ä¿ã®ã€ã³ã¹ããŒã«ïŒ
npm install
# or
yarn install
ããã«ãããåããã±ãŒãžã®`package.json`ãã¡ã€ã«ã«åºã¥ããŠãã¢ãã¬ãå ã®ãã¹ãŠã®ããã±ãŒãžã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããŸãã
3. ããã±ãŒãžå šäœã§ã³ãã³ããå®è¡ïŒ
lerna run test
ããã«ããã`test`ã¹ã¯ãªãããå®çŸ©ãããŠãããã¹ãŠã®ããã±ãŒãžã®`package.json`ãã¡ã€ã«ã§å®çŸ©ããã`test`ã¹ã¯ãªãããå®è¡ãããŸãã
4. ããã±ãŒãžã®å ¬éïŒ
lerna publish
ãã®ã³ãã³ãã¯ã³ãããå±¥æŽãåæãã倿Žãããããã±ãŒãžãç¹å®ããConventional Commitsã«åºã¥ããŠããŒãžã§ã³ãäžããnpmïŒãŸãã¯éžæããã¬ãžã¹ããªïŒã«å ¬éããŸãã
Lernaã®èšå®
`lerna.json`ãã¡ã€ã«ã¯Lernaã®èšå®ã®äžå¿ã§ããããã«ãããLernaã®åäœãã«ã¹ã¿ãã€ãºã§ããŸããäŸãã°ïŒ
- `packages`ïŒã¢ãã¬ãå ã®ããã±ãŒãžã®å Žæãæå®ããŸããå€ãã®å Žåã`["packages/*"]`ã«èšå®ãããŸãã
- `version`ïŒããŒãžã§ãã³ã°æŠç¥ãæå®ããŸãã`independent`ïŒåããã±ãŒãžãç¬èªã®ããŒãžã§ã³ãæã€ïŒãŸãã¯åºå®ããŒãžã§ã³ã«ããããšãã§ããŸãã
- `command`ïŒ`publish`ã`run`ãªã©ãç¹å®ã®Lernaã³ãã³ãã®ãªãã·ã§ã³ãèšå®ã§ããŸãã
`lerna.json` ã®äŸïŒ
{
"packages": [
"packages/*"
],
"version": "independent",
"npmClient": "npm",
"useWorkspaces": true,
"command": {
"publish": {
"conventionalCommits": true,
"message": "chore(release): publish"
}
}
}
NxïŒã¹ããŒãã§é«éãæ¡åŒµå¯èœãªãã«ãã·ã¹ãã
Nxã¯ãã¢ãã¬ã管çã®ããã®é«åºŠãªæ©èœãæäŸãã匷åãªãã«ãã·ã¹ãã ã§ããã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ããèšç®ãã£ãã·ã³ã°ãã¿ã¹ã¯ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã«éç¹ã眮ãããã«ãæéãšéçºè ã®çç£æ§ãå€§å¹ ã«åäžãããŸããLernaãäž»ã«ããã±ãŒãžã®ç®¡çã«çŠç¹ãåœãŠãŠããã®ã«å¯ŸããNxã¯ã³ãŒãçæããªã³ãã£ã³ã°ããã¹ãããããã€ã¡ã³ããå«ããã¢ãã¬ãã®ã¯ãŒã¯ãããŒå šäœã管çããããã®ããå æ¬çãªã¢ãããŒããæäŸããŸãã
Nxã®äž»ãªæ©èœ
- ã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ãïŒNxã¯ãããžã§ã¯ãã®äŸåé¢ä¿ã°ã©ããåæããæåŸã®ãã«ã以éã«å€æŽããããããžã§ã¯ãã®ã¿ãåãã«ãããŸããããã«ããããã«ãæéãå€§å¹ ã«ççž®ãããŸãã
- èšç®ãã£ãã·ã³ã°ïŒNxã¯ãã«ãããã¹ããªã©ã®ã¿ã¹ã¯ã®çµæããã£ãã·ã¥ãããããå ¥åã倿ŽãããŠããªãå Žåã¯åå©çšã§ããŸããããã«ãããéçºãµã€ã¯ã«ãããã«é«éåãããŸãã
- ã¿ã¹ã¯ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ïŒNxã¯åŒ·åãªã¿ã¹ã¯ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã·ã¹ãã ãæäŸããè€éãªãã«ããã€ãã©ã€ã³ãå®çŸ©ããŠå¹ççã«å®è¡ã§ããŸãã
- ã³ãŒãçæïŒNxã¯ããã¹ããã©ã¯ãã£ã¹ãšäžè²«ããæšæºã«åŸã£ãŠãæ°ãããããžã§ã¯ããã³ã³ããŒãã³ããã¢ãžã¥ãŒã«ãè¿ éã«äœæããã®ã«åœ¹ç«ã€ã³ãŒãçæããŒã«ãæäŸããŸãã
- ãã©ã°ã€ã³ãšã³ã·ã¹ãã ïŒNxã«ã¯ãReactãAngularãNode.jsãNestJSãªã©ãããŸããŸãªæè¡ããã¬ãŒã ã¯ãŒã¯ããµããŒãããè±å¯ãªãã©ã°ã€ã³ãšã³ã·ã¹ãã ããããŸãã
- äŸåé¢ä¿ã°ã©ãã®å¯èŠåïŒNxã¯ã¢ãã¬ãã®äŸåé¢ä¿ã°ã©ããå¯èŠåã§ãããããžã§ã¯ãéã®é¢ä¿ãçè§£ããæœåšçãªåé¡ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
- 圱é¿ç¯å²ã³ãã³ãïŒNxã¯ãç¹å®ã®å€æŽã«ãã£ãŠåœ±é¿ãåãããããžã§ã¯ãã«å¯ŸããŠã®ã¿ã¿ã¹ã¯ãå®è¡ããã³ãã³ããæäŸããŸããããã«ãããæ³šæãå¿ èŠãªé åã«éäžã§ããŸãã
Nxã®äœ¿çšäŸ
Nxã®äœ¿çšæ³ãç°¡åãªäŸã§ç€ºããŸããReactã¢ããªã±ãŒã·ã§ã³ãšNode.jsã©ã€ãã©ãªãæã€ã¢ãã¬ããäœæããŸãã
1. Nx CLIãã°ããŒãã«ã«ã€ã³ã¹ããŒã«ïŒ
npm install -g create-nx-workspace
2. æ°ããNxã¯ãŒã¯ã¹ããŒã¹ãäœæïŒ
create-nx-workspace my-monorepo --preset=react
cd my-monorepo
ããã«ãããReactã¢ããªã±ãŒã·ã§ã³ãæã€æ°ããNxã¯ãŒã¯ã¹ããŒã¹ãäœæãããŸãã`--preset=react`ãªãã·ã§ã³ã¯ãReactåºæã®èšå®ã§ã¯ãŒã¯ã¹ããŒã¹ãåæåããããã«Nxã«æç€ºããŸãã
3. ã©ã€ãã©ãªãçæïŒ
nx generate @nrwl/node:library my-library
ããã«ããã`my-library`ãšããååã®æ°ããNode.jsã©ã€ãã©ãªãçæãããŸããNxã¯ã©ã€ãã©ãªãšãã®äŸåé¢ä¿ãèªåçã«èšå®ããŸãã
4. ã¢ããªã±ãŒã·ã§ã³ããã«ãïŒ
nx build my-app
ããã«ãããReactã¢ããªã±ãŒã·ã§ã³ããã«ããããŸããNxã¯äŸåé¢ä¿ã°ã©ããåæããå¿ èŠãªãã¡ã€ã«ã®ã¿ãåãã«ãããŸãã
5. ãã¹ããå®è¡ïŒ
nx test my-app
ããã«ãããReactã¢ããªã±ãŒã·ã§ã³ã®åäœãã¹ããå®è¡ãããŸããNxã¯ãã¹ãçµæããã£ãã·ã¥ããŠãåŸç¶ã®ãã¹ãå®è¡ãé«éåããŸãã
6. äŸåé¢ä¿ã°ã©ãã衚瀺ïŒ
nx graph
ããã«ãããã¢ãã¬ãã®äŸåé¢ä¿ã°ã©ããå¯èŠåããWebã€ã³ã¿ãŒãã§ãŒã¹ãéããŸãã
Nxã®èšå®
Nxã¯ãã¯ãŒã¯ã¹ããŒã¹ã®ã«ãŒãã«ãã`nx.json`ãã¡ã€ã«ãéããŠèšå®ãããŸãããã®ãã¡ã€ã«ã¯ãã¯ãŒã¯ã¹ããŒã¹å ã®ãããžã§ã¯ãããããã®äŸåé¢ä¿ãããã³ãããã«å¯ŸããŠå®è¡ã§ããã¿ã¹ã¯ãå®çŸ©ããŸãã
`nx.json`ã®äž»èŠãªèšå®ãªãã·ã§ã³ã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- `projects`ïŒã¯ãŒã¯ã¹ããŒã¹å ã®ãããžã§ã¯ããšãã®èšå®ïŒã«ãŒããã£ã¬ã¯ããªããã«ãã¿ãŒã²ãããªã©ïŒãå®çŸ©ããŸãã
- `tasksRunnerOptions`ïŒã¿ã¹ã¯ã®å®è¡ãšçµæã®ãã£ãã·ã³ã°ãæ åœããã¿ã¹ã¯ã©ã³ããŒãèšå®ããŸãã
- `affected`ïŒå€æŽã«ãã£ãŠã©ã®ãããžã§ã¯ãã圱é¿ãåããããNxãã©ã®ããã«å€æããããèšå®ããŸãã
`nx.json` ã®äŸïŒ
{
"npmScope": "my-org",
"affected": {
"defaultBase": "main"
},
"implicitDependencies": {
"package.json": {
"dependencies": "*",
"devDependencies": "*"
},
".eslintrc.json": "*"
},
"tasksRunnerOptions": {
"default": {
"runner": "nx-cloud",
"options": {
"cacheableOperations": ["build", "lint", "test", "e2e"],
"accessToken": "...",
"canTrackAnalytics": false,
"showUsageWarnings": false
}
}
},
"targetDefaults": {
"build": {
"dependsOn": ["^build"],
"inputs": ["production", "default"],
"outputs": ["{projectRoot}/dist"]
}
},
"namedInputs": {
"default": ["{projectRoot}/**/*", "!{projectRoot}/dist/**/*", "!{projectRoot}/tmp/**/*"],
"production": ["!{projectRoot}/**/*.spec.ts", "!{projectRoot}/**/*.spec.tsx", "!{projectRoot}/**/*.spec.js", "!{projectRoot}/**/*.spec.jsx"]
},
"generators": {
"@nrwl/react": {
"application": {
"style": "css",
"linter": "eslint",
"unitTestRunner": "jest"
},
"library": {
"style": "css",
"linter": "eslint",
"unitTestRunner": "jest"
},
"component": {
"style": "css"
}
},
}
}
Lerna vs. NxïŒã©ã¡ããéžã¶ã¹ããïŒ
LernaãšNxã¯ã©ã¡ããããã³ããšã³ãã¢ãã¬ãã管çããããã®åªããããŒã«ã§ãããè¥å¹²ç°ãªãããŒãºã«å¯Ÿå¿ããŠããŸãããããžã§ã¯ãã«é©ããããŒã«ãéžæããã®ã«åœ¹ç«ã€æ¯èŒã以äžã«ç€ºããŸãïŒ
| æ©èœ | Lerna | Nx |
|---|---|---|
| çŠç¹ | ããã±ãŒãžç®¡ç | ãã«ãã·ã¹ãã ãšã¿ã¹ã¯ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ |
| ã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ã | éå®çïŒå€éšããŒã«ãå¿ èŠïŒ | çµã¿èŸŒã¿ã§é«åºŠã«æé©å |
| èšç®ãã£ãã·ã³ã° | ãªã | ãã |
| ã³ãŒãçæ | ãªã | ãã |
| ãã©ã°ã€ã³ãšã³ã·ã¹ãã | éå®ç | åºç¯ |
| åŠç¿æ²ç· | äœã | é«ã |
| è€éã | ããã·ã³ãã« | ããè€é |
| ãŠãŒã¹ã±ãŒã¹ | äž»ã«npmããã±ãŒãžã®ç®¡çãšå ¬éã«çŠç¹ãåœãŠããããžã§ã¯ãã | æé©åããããã«ãæéãã³ãŒãçæãå æ¬çãªãã«ãã·ã¹ãã ãå¿ èŠãšããå€§èŠæš¡ã§è€éãªãããžã§ã¯ãã |
次ã®å Žåã«LernaãéžæããŸãïŒ
- äž»ã«npmããã±ãŒãžã®ç®¡çãšå ¬éãå¿ èŠãªå Žåã
- ãããžã§ã¯ããæ¯èŒçå°èŠæš¡ããäžèŠæš¡ã§ããå Žåã
- åŠç¿æ²ç·ãäœããããã·ã³ãã«ãªããŒã«ã奜ãå Žåã
- ãã§ã«npmãYarnã«æ £ããŠããå Žåã
次ã®å Žåã«NxãéžæããŸãïŒ
- æé©åããããã«ãæéãšã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ããå¿ èŠãªå Žåã
- ã³ãŒãçææ©èœãå¿ èŠãªå Žåã
- ã¿ã¹ã¯ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãåããå æ¬çãªãã«ãã·ã¹ãã ãå¿ èŠãªå Žåã
- ãããžã§ã¯ããå€§èŠæš¡ã§è€éãªå Žåã
- ãã匷åãªããŒã«ãåŠã¶ããã«æéãæè³ããææ¬²ãããå Žåã
LernaãšNxã¯äœµçšã§ããŸããïŒ
ã¯ããLernaãšNxã¯äœµçšã§ããŸãããã®çµã¿åããã«ãããLernaã®ããã±ãŒãžç®¡çæ©èœã掻çšãã€ã€ãNxã®æé©åããããã«ãã·ã¹ãã ãšã¿ã¹ã¯ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã®æ©æµãåããããšãã§ããŸããNxãLernaã®ã¿ã¹ã¯ã©ã³ããŒãšããŠèšå®ããããšã§ãLernaã§ç®¡çãããããã±ãŒãžã«å¯ŸããŠã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ããšèšç®ãã£ãã·ã³ã°ãæäŸã§ããŸãã
ããã³ããšã³ãã¢ãã¬ã管çã®ãã¹ããã©ã¯ãã£ã¹
LernaãŸãã¯Nxã®ã©ã¡ããéžæãããã«ããããããããã³ããšã³ãã¢ãã¬ããæåè£ã«ç®¡çããããã«ã¯ããã¹ããã©ã¯ãã£ã¹ã«åŸãããšãéèŠã§ãïŒ
- æç¢ºãªãããžã§ã¯ãæ§é ã確ç«ããïŒãããžã§ã¯ããè«ççãã€äžè²«ããŠæŽçããŸããããã±ãŒãžãã©ã€ãã©ãªã«ã¯æç¢ºãªåœåèŠåã䜿çšããŸãã
- äžè²«ããã³ãŒãã£ã³ã°åºæºã匷å¶ããïŒãªã³ã¿ãŒããã©ãŒããã¿ãŒã䜿çšããŠããã¹ãŠã®ãããžã§ã¯ãã§äžè²«ããã³ãŒãã¹ã¿ã€ã«ã確ä¿ããŸããESLintãPrettierã®ãããªããŒã«ãã¯ãŒã¯ãããŒã«çµ±åã§ããŸãã
- ãã«ããšãã¹ãããã»ã¹ãèªååããïŒCI/CDãã€ãã©ã€ã³ã䜿çšããŠããã«ãããã¹ãããããã€ã®ããã»ã¹ãèªååããŸããJenkinsãCircleCIãGitHub Actionsãªã©ã®ããŒã«ã䜿çšã§ããŸãã
- ã³ãŒãã¬ãã¥ãŒãå®è£ ããïŒã³ãŒãã®å質ãšä¿å®æ§ã確ä¿ããããã«ã培åºçãªã³ãŒãã¬ãã¥ãŒã宿œããŸãããã«ãªã¯ãšã¹ããã³ãŒãã¬ãã¥ãŒããŒã«ã䜿çšããŸãã
- ãã«ãæéãšããã©ãŒãã³ã¹ãç£èŠããïŒãã«ãæéãšããã©ãŒãã³ã¹ã¡ããªã¯ã¹ã远跡ããŠãããã«ããã¯ãæ¹åã®äœå°ãããé åãç¹å®ããŸããNxã¯ãã«ãããã©ãŒãã³ã¹ãåæããããã®ããŒã«ãæäŸããŸãã
- ã¢ãã¬ãã®æ§é ãšããã»ã¹ãææžåããïŒã¢ãã¬ãã®æ§é ã䜿çšãããŠããããŒã«ãšæè¡ãéçºã¯ãŒã¯ãããŒã説æããæç¢ºãªããã¥ã¡ã³ããäœæããŸãã
- Conventional Commitsãæ¡çšããïŒConventional Commitsã䜿çšããŠãããŒãžã§ãã³ã°ãšãªãªãŒã¹ããã»ã¹ãèªååããŸããLernaã¯æåããConventional CommitsããµããŒãããŠããŸãã
çµè«
ããã³ããšã³ãã¢ãã¬ãã¯ãã³ãŒãå ±æãäŸåé¢ä¿ç®¡çã®ç°¡çŽ åãã³ã©ãã¬ãŒã·ã§ã³ã®åäžãªã©ãå€§èŠæš¡ã§è€éãªãããžã§ã¯ãã管çããäžã§å€§ããªå©ç¹ãæäŸããŸããLernaãšNxã¯ãããã³ããšã³ãã¢ãã¬ãã广çã«ç®¡çããã®ã«åœ¹ç«ã€åŒ·åãªããŒã«ã§ããLernaã¯npmããã±ãŒãžã®ç®¡çã«é©ããéžæè¢ã§ãããäžæ¹Nxã¯ã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ããã³ãŒãçæãªã©ã®é«åºŠãªæ©èœãåãããããå æ¬çãªãã«ãã·ã¹ãã ãæäŸããŸãããããžã§ã¯ãã®ããŒãºãæ éã«æ€èšãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãããã³ããšã³ãã¢ãã¬ããæåè£ã«æ¡çšãããã®å©ç¹ã享åããããšãã§ããŸãã
LernaãšNxã®ã©ã¡ãããéžæããéã«ã¯ãããŒã ã®çµéšããããžã§ã¯ãã®è€éããããã©ãŒãã³ã¹èŠä»¶ãªã©ã®èŠçŽ ãèæ ®ããããšãå¿ããªãã§ãã ãããäž¡æ¹ã®ããŒã«ã詊ããŠã¿ãŠãç¹å®ã®ããŒãºã«æãåã£ããã®ãèŠã€ããŠãã ããã
ã¢ãã¬ãã®æ ãããŸãããããšãé¡ã£ãŠããŸãïŒ